/**
 * 伪静态类 -- object 原型；
 */
var StrUtils = {};

StrUtils.isEmpty = function(str) {
	return str == null || str == undefined || str == '';
}


/**
 *  javascript 面向对象
 * 
 *  类和类的继承；
 * 
 * 
 */




/**
 * 普通类；-- Function 原型；
 * @param {String} userName
 * @param {String} userPassword
 */
 function User(userName, userPassword) {
	//共有属性和方法；public
	this.userName = userName;
	this.userPasswrd = userPassword;
	this.toString = function() {
		return this.userName + ',' + this.userPasswrd;
	}
	this.isEmpty = function() {
		return emputUser();
	}
	/**
	 * 私有方法中不能使用this，
	 * 使用this ->window;
	 */
	var _this = this;
	var privatePro = 'sdfsdf';
	var emputUser = function() {
		console.log(_this.toString());
		console.log(_this);
		return StrUtils.isEmpty(_this.userName) || StrUtils.isEmpty(_this.userPasswrd);
	}
}
 /**
  * 在User的原型中添加方法；此方法，会在_proto_中查找到；
  * 先查找User本身有没有checkUser方法，如果没有，则到_proto_中查找原型方法 ；
  */
 User.prototype.checkUser = function() {
 	console.log(this);
 	return StrUtils.isEmpty(this.userName) || StrUtils.isEmpty(this.userPasswrd);
 }

/**
 * 类的继承；
 * 1、使用call方法 ，继承 User类中的属性和方法；
 * 2、设置prototype，通过Object。create，继承User上的原型属性和方法；
 * 3、设置初始化方法，使用自己，如果不设置，只会是用User的初始化方法；
 * @param {Object} userId
 * @param {Object} userName
 * @param {Object} userPasswrd
 */
function ChildUser(userId,userName,userPasswrd) {
	User.call(this,userName,userPasswrd);//不会继承User原型中的方法；
	this.userId = userId;
	
	
	//重写toString方法 ；
	this.toString = function() {
		return this.userId +","+this.userName +","+this.userPasswrd;
	}
}


//继承父类的原型属性和原型方法，构造函数，存在与原型中；
ChildUser.prototype = Object.create(User.prototype);
//将构造函数，替换成自己的构造函数
ChildUser.prototype.constructor = ChildUser;

//重写原型方法checkUser；
ChildUser.prototype.checkUser = function() {
	return StrUtils.isEmpty(this.userName) || StrUtils.isEmpty(this.userPasswrd) || StrUtils.isEmpty(this.userId);
}



/**
 * 
 * 接口 也是一个function，
 * javascript的参数可以是function，
 * 所以感觉不如直接方法中写得了。
 * 
 * 
 */


//定义一个接口
 function ISay() {
	 this.say = function(msg){}
 }